import cv2
import turtle
import numpy as np
from PIL import Image


def get_RGBmessage(image):
    # 彩色读取
    img1 = cv2.imread(image, 1)
    # 灰度读取
    img2 = cv2.imread(image, 0)
    # 展示图片
    cv2.imshow("image_show_1", img1)
    cv2.waitKey(0)  # 0一直显示，直到有键盘输入。也可以是其他数字，毫秒级
    cv2.imshow("image_show_0", img2)
    cv2.waitKey(0)
    # 保存图片
    cv2.imwrite("picture_1.jpg", img1)
    # img1.shape 返回图像高（图像矩阵的行数）、宽（图像矩阵的列数）和通道数3个属性组成的元组，若图像是非彩色图，则只返回高和宽组成的元组。
    sp1 = img1.shape
    hSize = sp1[0]
    wSize = sp1[1]
    channel = sp1[2]
    print("{} 尺寸信息：".format(image), "高度：", hSize, "宽度：", wSize, "通道数：", channel)
    # 图像像素总数目
    imgSize = img1.size
    print(image, "像素总数目：", imgSize)

    rgb_list = []
    for x in range(sp1[1]):
        for y in range(sp1[0]):
            # print("坐标：", x, y)
            # b, g, r = img1[y, x]
            # print(b, g, r)
            value = img1[y, x]
            # print(value)
            rgb_list.append(value)

            # numpy.ndarray数据写入文件
            with open("RGBmessage.txt", "a+") as f:
                np.savetxt(f, np.column_stack(value), fmt="%d")

    print("RGB_list长度：", len(rgb_list))
    print("RGBmessage:", rgb_list)
    print("数组:", rgb_list[0])
    print("元素：", rgb_list[0][0], rgb_list[0][1], rgb_list[0][2])

    with open("RGBmessage.txt", "r") as f:
        # # 1、读取文件：read函数，read(size)方法，每次最多读取size个字节的内容
        # message = f.read().rstrip('\n')
        # print(message)
        # # 2、读取文件：readline函数
        # message= f.readline().rstrip('\n')
        # while message:
        #     print(message)
        #     message = f.readline().rstrip('\n')
        # # 3、读取文件：readlines函数，readlines(size)方法，每次最多读取size个字节的内容
        # message= f.readlines()
        # for line in message:
        #     print(line.rstrip('\n'))
        # # 4、读取文件
        # for line in f:
        #     print(line.rstrip('\n'))
        # 5、读取数据存入列表
        rgb_message = []
        message = f.readlines()
        for line in message:
            line = line.rstrip("\n")
            rgb_message.append(line)
        # print(rgb_message)
        # print('数组大小：', len(rgb_message))
        # for i in range(len(rgb_message)):
        #     print(rgb_message[i])
        print("元素：", rgb_message[0])
        print("切片：", rgb_message[0][0:3])
        print("字符替换：", rgb_message[0].replace(" ", ","))
    return rgb_list


# turtle海龟画图
def turtle_test():
    turtle.screensize(canvwidth=74, canvheight=89, bg="white")  # 画布大小
    turtle.setup(width=400, height=400, startx=0, starty=0)  # 绘图窗口大小
    # width, height: 输入宽和高为整数时, 表示像素为小数时, 表示占据电脑屏幕的比例
    # (startx, starty): 这一坐标表示 矩形窗口左上角顶点的位置, 如果为空, 则窗口位于屏幕中心
    turtle.title("绘图测试")
    # cmode -- 数值 1.0 或 255 其中之一，返回颜色模式或将其设为 1.0 或 255。构成颜色三元组的 r, g, b 数值必须在 0..cmode 范围之内。默认1.0
    turtle.colormode(cmode=255)
    turtle.pensize(1)  # 设置画笔宽度
    # 没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green", "red",也可以是RGB 3元组
    turtle.pencolor(255, 123, 109)
    turtle.speed(5)  # 设置画笔移动速度,画笔绘制的速度范围[0,10]整数, 数字越大越快
    turtle.hideturtle()  # 隐藏箭头

    turtle.goto(100, 100)
    turtle.pencolor("blue")
    turtle.goto(100, -100)
    turtle.pencolor("black")
    turtle.goto(-100, 100)
    turtle.pencolor(0, 255, 127)
    turtle.goto(-100, -100)
    turtle.pencolor(148, 0, 211)
    turtle.goto(0, 0)
    turtle.pencolor(123, 104, 238)
    turtle.goto(0, 100)
    turtle.pencolor(30, 144, 255)
    turtle.goto(-40.5, 100)
    turtle.pencolor(255, 165, 0)
    turtle.penup()  # 移动时不绘制图形, 提起笔，用于另起一个地方绘制时用
    turtle.goto(-40.5, -100)
    turtle.pencolor(244, 164, 96)
    turtle.pendown()  # 移动时绘制图形, 缺省时也为绘制
    turtle.goto(45, -100)
    turtle.pencolor(255, 0, 255)
    turtle.goto(45, 0)
    turtle.pencolor(255, 0, 0)
    turtle.circle(50)  # 画圆, 半径为正(负), 表示圆心在画笔的左边(右边)画圆
    turtle.pencolor(255, 99, 71)
    turtle.circle(-50)
    turtle.done()


def drawing(hSize, wSize, colorHex):
    turtle.screensize(canvwidth=74, canvheight=89, bg="white")
    turtle.setup(width=400, height=400, startx=0, starty=0)
    turtle.title("绘图")
    turtle.colormode(cmode=255)
    turtle.pensize(1)
    turtle.speed(10)
    turtle.hideturtle()  # 画笔隐藏
    num = hSize * wSize

    # 纵向画图(扫描时采用纵向)
    turtle.right(90)
    width = 0
    for i in range(num):
        turtle.pencolor(f"#{colorHex[i]}")
        turtle.pendown()
        turtle.forward(1)
        turtle.penup()
        if i % hSize == 0:
            width += 1
            # print(width)
            turtle.goto(width, 0)
        if i == num - 1:
            print("Done !")
    # 保存为eps矢量图
    turtle.getscreen()
    turtle.getcanvas().postscript(file="work.eps")
    # 将eps文件转换为jpg格式
    im = Image.open("work.eps")
    im.save("work.jpg", "JPEG")
    print("绘画已完成，已保存，窗口将一直打开，关闭需要手动执行")
    turtle.done()  # 不提供自动关闭窗口的功能。它仅仅使窗口保持打开状态，直到用户手动关闭它。
    # # 等待一段时间（例如5秒），然后关闭窗口
    # time.sleep(5)  # 等待5秒
    # turtle.bye()  # 或者使用 turtle.getwindow().destroy()


# RGB颜色转换成16进制颜色
def RGB_to_Hex(rgb_list):
    colorHex = []
    for i in range(len(rgb_list)):
        RGB = rgb_list[i]
        color = ""
        # 下面是按照RGB颜色顺序进行转换的(这种方式画出的图与原图颜色顺序不一致)
        # for i in RGB:
        #     num = int(i)
        #     # 将R、G、B分别转化为16进制拼接转换并大写  hex() 函数用于将10进制整数转换成16进制，以字符串形式表示
        #     color += str(hex(num))[-2:].replace('x', '0').upper()
        # 下面是按照BGR颜色顺序进行转换的(这种方式画出的图与原图颜色顺序一致）
        for i in reversed(RGB):
            num = int(i)
            # 将R、G、B分别转化为16进制拼接转换并大写  hex() 函数用于将10进制整数转换成16进制，以字符串形式表示
            color += str(hex(num))[-2:].replace("x", "0").upper()
        colorHex.append(color)
    print("RGB颜色转换成16进制颜色已完成")
    return colorHex


def ndarrayToList(rgb_list):
    # print(type(rgb_list[0]))
    for i in range(len(rgb_list)):
        rgb_list[i] = rgb_list[i].tolist()
    # print(rgb_list)
    # print(type(rgb_list[0]))
    return rgb_list


if __name__ == "__main__":
    image = "image.jpg"
    img = cv2.imread(image)
    size = img.shape
    hSize = size[0]
    wSize = size[1]
    channel = size[2]
    print("{} 尺寸信息：".format(image), size, "高度：", hSize, "宽度：", wSize, "通道数：", channel)
    rgb_list = get_RGBmessage(image)
    rgb_list = ndarrayToList(rgb_list)
    colorHex = RGB_to_Hex(rgb_list)
    # turtle_test()
    drawing(hSize, wSize, colorHex)
